package com.tim.javaApi;

import java.math.BigDecimal;
import java.util.Date;
import java.util.Formatter;

/**
 * String.format方法
 *  个人：https://blog.csdn.net/yun6713/article/details/109656336
 *  摘录：https://blog.csdn.net/u010137760/article/details/82869637
 *  格式：%[argument_index$][flags][width][.precision]conversion
 *
 * MySQL日期格式，DATE_FORMAT(NOW(), '%Y-%m-%d %T')：
 *  %Y，%y；年。四位、两位
 *  %m；月
 *  %d；日。
 *  %Y-%m-%d，年-月-日
 *  %H，%h；时
 *  %i；分
 *  %s；秒
 *  %T；同%H:%i:%s
 *
 *
 */
public class StrFormatHelper {
    public static final Formatter FORMATTER=null;
    /**
     * 字符串格式化
     */
    public static void common(){
        // 按序替换
        System.out.println(String.format("%s%s", "1","2"));
        // 按指定顺序替换
        System.out.println(String.format("%2$s%1$s", "1",2));

        BigDecimal big = new BigDecimal(1);
        System.out.println(String.format("%1$.2f %2$.2f", big, null));
        System.out.println(new Formatter().format("format:%1$.2f %2$.2f", big, null));
        System.out.println("1 ,2 ".replaceAll("\\s+", ""));
        System.out.println((int)(234.12-32.08));
        System.out.println(String.format("%04d", 3));
        big = BigDecimal.valueOf(1.123456789);
        System.out.println(String.format("%1$.2f", big));
        System.out.println(String.format("%1$.3f", BigDecimal.valueOf(0)));

    }

    /**
     * 顺序从1$开始
     *  <；使用前一个参数
     */
    public static void argument_index(){
        // 按指定顺序替换
        System.out.println(String.format("%2$s%1$s", "1",2));
        System.out.println(String.format("%2$s%<s%1$s", "1",2));
    }

    /**
     * 标志是一组修改输出格式的字符
     *  ,；分割大数值，整数部分。
     *  +；显示正负号。
     *  -；左对齐，默认右对齐。需要宽度
     *  0；0填充宽度
     *  0、-；不可联用
     */
    public static void flags(){
        // ,；分割大数值，整数部分
        System.out.println(",；分割大数值，整数部分");
        System.out.println(String.format("%,d", 123456789));
        System.out.println(String.format("%,f", 123456789.987654321));
        System.out.println(String.format("%,d", -123456789));
        System.out.println(String.format("%,f", -123456789.987654321));

        // +；显示正号
        System.out.println("+；显示正号");
        System.out.println(String.format("%+d", 123456789));
        System.out.println(String.format("%+f", 123456789.987654321));
        System.out.println(String.format("%+d", -123456789));
        System.out.println(String.format("%+f", -123456789.987654321));

        // -；左对齐，默认右对齐。需要宽度
        System.out.println("-；左对齐，默认右对齐。需要宽度");
        System.out.println(String.format("%20d", 123456789));
        System.out.println(String.format("%20f", 123456789.987654321));
        System.out.println(String.format("%-20d", -123456789));
        System.out.println(String.format("%-20f", -123456789.987654321));

        // 0；0填充宽度，不可与-联用
        System.out.println("0；0填充宽度，不可与-联用");
        System.out.println(String.format("%020d", 123456789));
        System.out.println(String.format("%0+20f", 123456789.987654321));

    }

    /**
     * 最小宽度，精度
     */
    public static void widthAndPrecision(){
        System.out.println("最小宽度，默认右对齐");
        System.out.println(String.format("%15d", 123456789));
        System.out.println(String.format("%15f", 123456789.987654321));
        System.out.println(String.format("%15d", -123456789));
        System.out.println(String.format("%15f", -123456789.987654321));

        System.out.println("最大精度，只适用于小数。参数为小数，type为f等");
        System.out.println(String.format("%15.2f", 123456789D));
        System.out.println(String.format("%15.2f", 123456789.987654321));
        System.out.println(String.format("%15.2f", -123456789D));
        System.out.println(String.format("%15.2f", -123456789.987654321));
        System.out.println(String.format("%4.2f%%", 0d));
        System.out.println(String.format("%.2f%%", -0.1d).replaceAll("\\.?0+%$", "%"));

    }

    /**
     * 转换类型。
     *  s、S。字符串
     *  c、C。字符，参数必须为字符
     *  d、f。数值，d必须整型，f必须小数
     *  %。转义%，%%=%，%n=\n
     *
     */
    public static void type(){
        System.out.println("s、S。字符串");
        System.out.println(String.format("%s", "abc"));
        System.out.println(String.format("%S", "abc"));
        System.out.println(String.format("%S", 1));

        System.out.println("c、C。字符");
        System.out.println(String.format("%c", 'a'));
        System.out.println(String.format("%C", 'a'));

        System.out.println("%。转义%，%%=%，%n=\n");
        System.out.println(String.format("%%"));
        System.out.println(String.format("a%nb"));
    }

    /**
     * 时间转换
     *  ty、tY；两位年、四位年
     *  tm；月
     *  td、tj；月天、年天
     *  tH、tl；24小时、12小时
     *  tM；分
     *  tS；秒。
     *  tF；同%tY-%tm-%td
     *  tT；同%tH:%tM:%tS
     *  tr；同 %tl:%tM:%tS %tp
     *  tp；上午下午
     *  ta、tA；星期几
     *
     */
    public static void dateType(){
        Date now = new Date();
        System.out.println("ty、tY；两位年、四位年");
        System.out.println(String.format("%ty %<tY", now));
        System.out.println("tm；月");
        System.out.println(String.format("%tm", now));
        System.out.println("td、tj；月天、年天");
        System.out.println(String.format("%td %<tj", now));
        System.out.println("tF；同%tY-%tm-%td");
        System.out.println(String.format("%tF", now));
        System.out.println("tT；同%tH:%tM:%tS");
        System.out.println(String.format("%tT", now));
        System.out.println("tp；上午下午");
        System.out.println(String.format("%tp", now));
        System.out.println("tr；同 %tl:%tM:%tS %tp");
        System.out.println(String.format("%tr", now));
        System.out.println("ta、tA；星期几");
        System.out.println(String.format("%ta %<tA", now));

    }

    public static void main(String[] args) {
//        common();
//        argument_index();
//        flags();
        widthAndPrecision();
//        type();
//        dateType();
    }



}
